//package flow;
//
//import java.util.Arrays;
//import java.util.concurrent.Flow;
//import java.util.concurrent.SubmissionPublisher;
//
//public class MySubscriber<T> implements Flow.Subscriber<T> {
//
//    private Flow.Subscription subscription;
//
//    @Override
//    public void onSubscribe(Flow.Subscription subscription) {
//        this.subscription = subscription;
//        subscription.request(1);
//        System.out.println(Thread.currentThread().getName() + " onSubscribe");
//    }
//
//    @Override
//    public void onNext(T item) {
//        System.out.println(Thread.currentThread().getName() + " received: " + item);
//        subscription.request(1);
//    }
//
//    @Override
//    public void onError(Throwable throwable) {
//        throwable.printStackTrace();
//        synchronized ("A") {
//            "A".notifyAll();
//        }
//    }
//
//    @Override
//    public void onComplete() {
//        System.out.println("done");
//        synchronized ("A") {
//            "A".notifyAll();
//        }
//    }
//
//    public static void main(String[] args) throws InterruptedException {
//        SubmissionPublisher<String> publisher = new SubmissionPublisher<>();
//        MySubscriber<String> subscriber1 = new MySubscriber<>();
//        MySubscriber<String> subscriber2 = new MySubscriber<>();
//        publisher.subscribe(subscriber1);
//        publisher.subscribe(subscriber2);
//
//
//        System.out.println("Publishing data item .... ");
//        String[] items = {"A", "B", "C", "D"};
//        Arrays.stream(items).forEach(item -> {
//            publisher.submit(item);
//            System.out.println(Thread.currentThread().getName() + " publish " + item);
//        });
//        publisher.close();
//
//        synchronized ("A") {
//            "A".wait();
//        }
//    }
//}
